/**
 * 随机数
 * @param {*} max
 * @param {*} min
 * @returns
 */
export function randomNum(max, min) {
  let num = parseInt(Math.random() * (max - min + 1) + min);
  return num;
}
// --------------------------------------------时间--------------------------------------
// 将时间转化为指定格式，dateStr不传默认当前时间
/* 
使用
formatDate('YY') -- "2022"
formatDate('YY-MM') -- "2022-07"
formatDate('YY-MM-DD') -- "2022-07-01"
formatDate('YY-MM-DD hh:mm:ss') -- "2022-07-01 10:08:40"
formatDate('星期w') -- "星期四"
*/
export function formatDate(fmt, dateStr = null) {
  let date = null;
  if (!dateStr) {
    date = new Date();
  } else {
    date = new Date(dateStr);
  }

  const o = {
    "Y+": date.getFullYear(),
    "M+": date.getMonth() + 1, // 月
    "D+": date.getDate(), // 日
    "h+": date.getHours(), // 时
    "m+": date.getMinutes(), // 分
    "s+": date.getSeconds(), // 秒
    W: date.getDay(), // 周
  };
  for (let k in o) {
    if (new RegExp("(" + k + ")").test(fmt)) {
      fmt = fmt.replace(RegExp.$1, () => {
        if (k === "W") {
          // 星期几
          const week = ["日", "一", "二", "三", "四", "五", "六"];
          return week[o[k]];
        } else if (k === "Y+" || RegExp.$1.length === 1) {
          // 年份 or 小于10不加0
          return o[k];
        } else {
          return ("00" + o[k]).substr(("" + o[k]).length); // 小于10补位0
        }
      });
    }
  }
  return fmt;
}

/*
获取n周前或者n周后的周一和周日的日期
使用

*/
export function getWeekRange(n = 0) {
  // 获取当前日期
  var now = new Date();

  // 获取当前日期是一周中的第几天（0 表示周日，1 表示周一，...，6 表示周六）
  var dayOfWeek = now.getDay();

  // 计算目标周的周一日期
  var monday = new Date(now.getTime());
  monday.setDate(monday.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1));

  // 根据 n 调整目标周
  monday.setDate(monday.getDate() + 7 * n); // n 周前或后

  // 获取目标周的周日日期
  var sunday = new Date(monday.getTime() + 6 * 24 * 60 * 60 * 1000);

  return {
    monday: monday,
    sunday: sunday
  };
}

// 获取本月或指定月份的最后一天
export function getMonthFinalDay(year, month) {
  var day = "";
  if (year == null || year == undefined || year == "") {
    year = new Date().getFullYear();
  }
  if (month == null || month == undefined || month == "") {
    month = new Date().getMonth() + 1;
  }
  day = new Date(new Date(year, month).setDate(0)).getDate();
  return year + "-" + month + "-" + day;
}

/* 
 获取某个日期几天前(传入负整数) 或者几天后(传入正整数) 的日期
使用 可以配合 本文件里的formatDate方法
dateBefore(formatDate('YY-MM-DD'),-1)
*/
export function dateBefore(begin_date, num = 0) {
  var begin = new Date(begin_date);
  if (num < 0) {
    var new_ = new Date((begin.getTime() / 1000 - -num * 86400) * 1000);
  } else {
    var new_ = new Date((begin.getTime() / 1000 + num * 86400) * 1000);
  }
  var time_ = new_.toLocaleDateString().replace(/\//g, "-");
  var arr = time_.split("-");

  arr[1] = "0" + arr[1] < 10 ? "0" + arr[1] : arr[1];
  arr[2] = "0" + arr[2] < 10 ? "0" + arr[2] : arr[2];
  return arr.join("-");
}

/**
 * 时间戳转换成 刚刚/几天前
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (("" + time).length === 10) {
    time = parseInt(time) * 1000;
  } else {
    time = +time;
  }
  const d = new Date(time);
  const now = Date.now();

  const diff = (now - d) / 1000;

  if (diff < 30) {
    return "刚刚";
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + "分钟前";
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + "小时前";
  } else if (diff < 3600 * 24 * 2) {
    return "1天前";
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      "月" +
      d.getDate() +
      "日" +
      d.getHours() +
      "时" +
      d.getMinutes() +
      "分"
    );
  }
}

// 计时 返回传入的时间到当前时间的时长
export function calculateElapsedTime(inputTimeStr) {
  // 将输入的时间字符串转换为Date对象
  const inputTime = new Date(inputTimeStr);

  // 检查输入时间是否有效
  if (isNaN(inputTime)) {
    throw new Error("Invalid date format");
  }

  // 获取当前时间
  const currentTime = new Date();

  // 计算时间差，单位为毫秒
  const elapsedTimeMs = currentTime.getTime() - inputTime.getTime();

  // 转换为小时和分钟
  const hours = Math.floor(elapsedTimeMs / (1000 * 60 * 60));
  const minutes = Math.floor((elapsedTimeMs % (1000 * 60 * 60)) / (1000 * 60));

  // 返回格式化的结果
  return `${hours}小时${minutes}分钟`;
}

// 判断第一个数组是否完全包含第二个数组
export function isContained(a, b) {
  // a和b其中一个不是数组，直接返回false
  if (!(a instanceof Array) || !(b instanceof Array)) return false;
  const len = b.length;
  // a的长度小于b的长度，直接返回false
  if (a.length < len) return false;
  for (let i = 0; i < len; i++) {
    // 遍历b中的元素，遇到a没有包含某个元素的，直接返回false
    if (!a.includes(b[i])) return false;
  }
  // 遍历结束，返回true
  return true;
}

// 递归根据 code 获取 name
export function getNameByCode(tree, code) {
  let result;
  if (!tree) {
    return;
  }
  for (let i = 0; i < tree.length; i++) {
    let item = tree[i];
    if (item.code == code && !result) {
      result = item.name;
      break;
    } else if (item.children && item.children.length > 0 && !result) {
      result = this.getStorageName(item.children, code);
    }
  }
  return result;
}

/**
 * 判断是不是车牌号
 * @param {*} plateNumber
 * @returns
 */
export function isLicenseNo(plateNumber) {
  let str =
    /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[警京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼]{0,1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
  return str.test(plateNumber);
}

// 判断是不是浮点数
export function isFloat(input) {
  return !isNaN(parseFloat(input)) && parseFloat(input) % 1 !== 0;
}

// 补齐2位小数
export function formatDecimal(num) {
  let numStr = null;
  if (num === undefined || num === null || num === "" || num === NaN) {
    numStr = num;
  } else {
    numStr = num.toString();
    // console.log(numStr, numStr.indexOf(".") === -1);
    if (numStr.indexOf(".") !== -1 && numStr.split(".")[1].length === 1) {
      numStr += "0";
    } else if (numStr.indexOf(".") === -1) {
      numStr += ".00";
    }
  }
  numStr = parseFloat(numStr).toFixed(2)
  // console.log('numStr',numStr)
  return numStr;
}

/*
特殊业务:处理转换昨天、今天、本周、上周为具体时间（举例：早10点为基准，10点前为昨天，10点后为今天）
params: 今天0  昨天1  本周2  本月3 
orgStartTime:10:00:01  此处规则如果变化 需要调整代码
orgEndTime:10:00:00 此处规则如果变化 需要调整代码
return ['2020:10:09 10:00:01','2020:10:10 10:00:00']
*/
export function transformWorkTime(params, orgStartTime, orgEndTime) { 
  // console.log('params', params)
  let timeRange = []
  const now = new Date(); 
  const year = now.getFullYear();
  let endYear = now.getFullYear();  
  let month = now.getMonth() + 1; // 本月
  let monthNext = now.getMonth() + 2; // 下月
  let day = now.getDate();
  if (month < 10) month = '0' + month;
  if (month > 11) {
    endYear += 1
    monthNext = 1
  } 
  if (monthNext < 10) monthNext = '0' + monthNext;
  if (day < 10) day = '0' + day;

  let hours = now.getHours();
  if (hours < 10)
    hours = '0' + hours;
  let minutes = now.getMinutes();
  if (minutes < 10)
    minutes = '0' + minutes;
  let seconds = now.getSeconds();
  if (seconds < 10)
    seconds = '0' + seconds;
  let nowTimeStr = "" + hours + minutes + seconds
  let orgEndTimeStr = orgEndTime.split(':').join('')
  let orgStartTimeStr = orgStartTime.split(':').join('') 
  // console.log('本周nowTimeStr', nowTimeStr)
  // console.log('本周orgEndTimeStr', orgEndTimeStr)
  // console.log('本周orgStartTimeStr', orgStartTimeStr)
  if (params == '今日' || params == 0) {
    if (nowTimeStr >= orgEndTimeStr) { 
      // 开始时间为系统开始时间 结束时间为当前时间             
      timeRange = [
        formatDate('YY-MM-DD') + ' ' + orgStartTime,
        dateBefore(formatDate('YY-MM-DD'), + 1) + ' ' + orgEndTime,
      ]
    } else { 
      // 开始时间为昨天时间加系统时间的时分秒 结束当天的系统结束时间
      timeRange = [
        dateBefore(formatDate('YY-MM-DD'), -1) + ' ' + orgStartTime,
        formatDate('YY-MM-DD') + ' ' + orgEndTime
      ]
    }
  }
  else if (params == '昨日' || params == 1 ) {
    if (nowTimeStr >= orgEndTimeStr) {
      // 今日条件下减1天
      timeRange = [
        dateBefore(formatDate('YY-MM-DD'), -1) + ' ' + orgStartTime,
        dateBefore(formatDate('YY-MM-DD')) + ' ' + orgEndTime
      ]
    } else {
      // 今日条件下减2天
      timeRange = [
        dateBefore(formatDate('YY-MM-DD'), -2) + ' ' + orgStartTime,
        dateBefore(formatDate('YY-MM-DD'), -1) + ' ' + orgEndTime
      ]
    }
  }
  else if (params == '本周' || params == 2) {   
    // 实际为上周： 周一且时间小于系统开始时间
    if( now.getDay() === 1 &&  nowTimeStr < orgStartTimeStr){ 
      const { monday, sunday } = getWeekRange(-1)  
      timeRange = [ formatDate('YY-MM-DD', monday) + ' ' + orgStartTime, dateBefore(formatDate('YY-MM-DD', sunday), + 1) + ' ' + orgEndTime ]
    }else{
      // 正常为本周
      const { monday, sunday } = getWeekRange(0)  
      timeRange = [ formatDate('YY-MM-DD', monday) + ' ' + orgStartTime,  dateBefore(formatDate('YY-MM-DD', sunday), + 1) + ' ' + orgEndTime ] 
    }
    // 注意是：本月
  }else if (params == '本月' || params == 3) { 
    // 上月: 特例今天是第一个月的第一天的10：01点前算 
    if(day === '01' && nowTimeStr >= orgStartTimeStr){ 
      let preYear = year
      let preMonth = now.getMonth() // 获取上一月份
      if(preMonth < 10) preMonth = '0' + preMonth
      if(month === '01'){
        preYear =  year - 1
        preMonth = '12'
      } 
      timeRange = [ preYear + '-' + preMonth + '-' + '01'  + ' ' + orgStartTime,  + '-' + month + '-' + '01'  + ' ' + orgEndTime ]
    }
    // 本月
    else{
      timeRange = [ year + '-' + month + '-'  + '01'  + ' ' + orgStartTime, endYear + '-' + monthNext + '-' + '01'  + ' ' + orgEndTime ]
    }   
  }
  // console.log('timeRange-result:',timeRange)
  return timeRange;
}
